<?php
class SearchController extends Sosweb_Controller_Action
{
	function init()
	{
		parent::init();
		$this->logger->info('Inicjalizacja strony wyszukiwania profitmania.pl przez uzytkownika z IP: '.$_SERVER['REMOTE_ADDR']);
		
		$this->_helper->layout()->getView()->headTitle('ProfitMania.pl - Zarabiaj na zakupach - '.Sosweb_Const_DescriptionConst::$TITLE_1, 'SET');
		$this->_helper->layout()->getView()->getHelper('HeadMeta')->appendName('description', Sosweb_Const_DescriptionConst::$DESC_1);		
	}

	function indexAction()
	{
		$this->logger->warn('Niewłaściwe wywołanie adresu strony. Nastąpi przekierowania do strony głównej serwisu.');
		
		return $this->_forward('index', 'index');		
	}

	function queryAction()
	{
        $request = clone $this->getRequest();
        $request->setActionName('pquery');
        $this->_helper->actionStack($request);
		
        $request = clone $this->getRequest();
        $request->setActionName('cquery');
        $this->_helper->actionStack($request);
	}	
	
	function pqueryAction()
	{
		$request = clone $this->getRequest();
		
		if (!$request->isPost())
		{
			//po jakiej kolumnie sortujemy
			$keywords = trim($request->getParam('key'));
			//po jakiej kolumnie sortujemy
			$sortColumn = $request->getParam('sort');
			//jakiego rodzaju danych porcjowanie - c/p
			$portionType = $request->getParam('type');
			//numer porcji danych
			$pageNo = $request->getParam('pageNo', 1);
			$pageNo = ($portionType == null || strtolower($portionType) == 'p' ? $pageNo : 1);
			
			if (isset($keywords))
			{
				try
				{
					$dataPortion = Sosweb_Const_ProfitmaniaConst::$TABLE_VIEW_DATA_NUM;
					$keywords_upper = strtoupper($keywords);
					
					$where = 'upper(subject) like \'%'.$keywords_upper.'%\' or upper(message) like \'%'.$keywords_upper.'%\'';
					
					//spreparowanie fragmentu zapytania odpowiedzialnego za sortowanie
					if ($sortColumn != null)
					{
						$sortColumnText = $sortColumn;
						$descending_columns = array('posted_date', 'views');
						$is_desc = in_array($sortColumnText, $descending_columns);
						
						$this->logger->info('Pozycja: '.$is_desc);
						
						if ($is_desc)
						{
							$sortColumnText .= ' DESC';	
						}				
					}
					else
					{
						$sortColumnText = 'tid DESC';
					}
								
					$promotions_view = new PromotionsView();
					$select_promotions = $promotions_view->select();
					$select_promotions->where($where)
									->limit($dataPortion, ($pageNo-1)*$dataPortion)
									->order($sortColumnText);
					
					$select_promotions_cnt = $promotions_view->select();
					$select_promotions_cnt->setIntegrityCheck(false)
									->from($promotions_view, 'count(*) as data_count')
									->where($where);
									
		       		$this->logger->info('Fetching promotions data for keyword '.$keywords.'. '.$select_promotions->assemble());
					$promotions = $promotions_view->fetchAll($select_promotions);
					$promotions_cnt = $promotions_view->fetchRow($select_promotions_cnt);
					
					if(count($promotions)== 0)
					{
						$this->logger->warn('Nie znaleziono promocji dla zdefiniowanego słowa kluczowego.');
					}

					$this->view->pageNo = $pageNo;
					$this->view->sortColumn = $sortColumn;
					$this->view->promotions = $promotions;
					$this->view->promotions_cnt = $promotions_cnt->data_count;
					$this->view->keywords = $keywords;
				}
				catch(Zend_Exception $ex)
				{
					$this->logger->error($ex->getMessage());
					$this->view->message = 'Wystąpił błąd aplikacji podczas wyszukiwania promocji dla słowa kluczowego '.$keywords.'.';
					
					return $this->_forward('index', 'index');
				} 
			}
			else
			{
				$this->logger->warn('Nastąpiło wywołanie funkcji wyszukiwania bez podania słów kluczowych.');
				$this->view->message = 'Nie podano słów kluczowych do wyszukiwania.';
				
				return $this->_forward('index', 'index');			
			}
		}
		else
		{
			$this->logger->warn('Wyszukiwanie interesujących promocji możliwe jest tylko z wykorzystaniem przygotowanego formularza.');
			$this->view->message = 'W celu wyszukania interesującej promocji skorzystaj z przygotowanego formularza.';
			
			return $this->_forward('index', 'index');			
		}
	}

	function cqueryAction()
	{
		$request = clone $this->getRequest();
		
		if (!$request->isPost())
		{
			//po jakiej kolumnie sortujemy
			$keywords = trim($request->getParam('key'));
			//po jakiej kolumnie sortujemy
			$sortColumn = $request->getParam('sort');
			//jakiego rodzaju danych porcjowanie - c/p
			$portionType = $request->getParam('type');
			//numer porcji danych
			$pageNo = $request->getParam('pageNo', 1);
			$pageNo = ($portionType == null || strtolower($portionType) == 'c' ? $pageNo : 1);
						
			if (isset($keywords))
			{
				try
				{
					$dataPortion = Sosweb_Const_ProfitmaniaConst::$TABLE_VIEW_DATA_NUM;
					$keywords_upper = strtoupper($keywords);
					
					$where = 'upper(title) like \'%'.$keywords_upper.'%\' or upper(content) like \'%'.$keywords_upper.'%\'';
					
					//spreparowanie fragmentu zapytania odpowiedzialnego za sortowanie
					if ($sortColumn != null)
					{
						$sortColumnText = $sortColumn;
						$descending_columns = array('posted_date', 'views');
						$is_desc = in_array($sortColumnText, $descending_columns);
						
						$this->logger->info('Pozycja: '.$is_desc);
						
						if ($is_desc)
						{
							$sortColumnText .= ' DESC';	
						}				
					}
					else
					{
						$sortColumnText = 'id DESC';
					}
					
					$coupons_view = new CouponsView();
					$select_coupons = $coupons_view->select();
					$select_coupons->where($where)
								->limit($dataPortion, ($pageNo-1)*$dataPortion)
								->order($sortColumnText);

					$select_coupons_cnt = $coupons_view->select();
					$select_coupons_cnt->setIntegrityCheck(false)
									->from($coupons_view, 'count(*) as data_count')
									->where($where);
								
		       		$this->logger->info('Fetching coupons data for keyword '.$keywords.'. '.$select_coupons->assemble());
					$coupons = $coupons_view->fetchAll($select_coupons);
					$coupons_cnt = $coupons_view->fetchRow($select_coupons_cnt);
	
					if(count($coupons)== 0)
					{
						$this->logger->warn('Nie znaleziono kuponów dla zdefiniowanego słowa kluczowego.');
					}

					$this->view->pageNo = $pageNo;
					$this->view->sortColumn = $sortColumn;
					$this->view->coupons = $coupons;
					$this->view->coupons_cnt = $coupons_cnt->data_count;
					$this->view->keywords = $keywords;
				}
				catch(Zend_Exception $ex)
				{
					$this->logger->error($ex->getMessage());
					$this->view->message = 'Wystąpił błąd aplikacji podczas wyszukiwania kuponów dla słowa kluczowego '.$keywords.'.';
					
					return $this->_forward('index', 'index');
				} 
			}
			else
			{
				$this->logger->warn('Nastąpiło wywołanie funkcji wyszukiwania bez podania słów kluczowych.');
				$this->view->message = 'Nie podano słów kluczowych do wyszukiwania.';
				
				return $this->_forward('index', 'index');			
			}
		}
		else
		{
			$this->logger->warn('Wyszukiwanie interesujących kuponów możliwe jest tylko z wykorzystaniem przygotowanego formularza.');
			$this->view->message = 'W celu wyszukania interesującej kupony skorzystaj z przygotowanego formularza.';
			
			return $this->_forward('index', 'index');			
		}
	}	
}